home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / IOBinding.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  16KB  |  602 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import types
  6. import sys
  7. import codecs
  8. import tempfile
  9. import tkFileDialog
  10. import tkMessageBox
  11. import re
  12. from Tkinter import *
  13. from SimpleDialog import SimpleDialog
  14. from configHandler import idleConf
  15.  
  16. try:
  17.     from codecs import BOM_UTF8
  18. except ImportError:
  19.     BOM_UTF8 = '\xef\xbb\xbf'
  20.  
  21.  
  22. try:
  23.     import locale
  24.     locale.setlocale(locale.LC_CTYPE, '')
  25. except (ImportError, locale.Error):
  26.     pass
  27.  
  28. encoding = 'ascii'
  29. if sys.platform == 'win32':
  30.     
  31.     try:
  32.         encoding = locale.getdefaultlocale()[1]
  33.         codecs.lookup(encoding)
  34.     except LookupError:
  35.         pass
  36.  
  37. else:
  38.     
  39.     try:
  40.         encoding = locale.nl_langinfo(locale.CODESET)
  41.         if encoding is None or encoding is '':
  42.             encoding = 'ascii'
  43.         
  44.         codecs.lookup(encoding)
  45.     except (NameError, AttributeError, LookupError):
  46.         
  47.         try:
  48.             encoding = locale.getdefaultlocale()[1]
  49.             if encoding is None or encoding is '':
  50.                 encoding = 'ascii'
  51.             
  52.             codecs.lookup(encoding)
  53.         except (ValueError, LookupError):
  54.             pass
  55.  
  56.  
  57. encoding = encoding.lower()
  58. coding_re = re.compile('coding[:=]\\s*([-\\w_.]+)')
  59.  
  60. class EncodingMessage(SimpleDialog):
  61.     '''Inform user that an encoding declaration is needed.'''
  62.     
  63.     def __init__(self, master, enc):
  64.         self.should_edit = False
  65.         self.root = top = Toplevel(master)
  66.         top.bind('<Return>', self.return_event)
  67.         top.bind('<Escape>', self.do_ok)
  68.         top.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
  69.         top.wm_title('I/O Warning')
  70.         top.wm_iconname('I/O Warning')
  71.         self.top = top
  72.         l1 = Label(top, text = 'Non-ASCII found, yet no encoding declared. Add a line like')
  73.         l1.pack(side = TOP, anchor = W)
  74.         l2 = Entry(top, font = 'courier')
  75.         l2.insert(0, '# -*- coding: %s -*-' % enc)
  76.         l2.pack(side = TOP, anchor = W, fill = X)
  77.         l3 = Label(top, text = 'to your file\nChoose OK to save this file as %s\nEdit your general options to silence this warning' % enc)
  78.         l3.pack(side = TOP, anchor = W)
  79.         buttons = Frame(top)
  80.         buttons.pack(side = TOP, fill = X)
  81.         self.default = self.cancel = 0
  82.         b1 = Button(buttons, text = 'Ok', default = 'active', command = self.do_ok)
  83.         b1.pack(side = LEFT, fill = BOTH, expand = 1)
  84.         b2 = Button(buttons, text = 'Edit my file', command = self.do_edit)
  85.         b2.pack(side = LEFT, fill = BOTH, expand = 1)
  86.         self._set_transient(master)
  87.  
  88.     
  89.     def do_ok(self):
  90.         self.done(0)
  91.  
  92.     
  93.     def do_edit(self):
  94.         self.done(1)
  95.  
  96.  
  97.  
  98. def coding_spec(str):
  99.     '''Return the encoding declaration according to PEP 263.
  100.  
  101.     Raise LookupError if the encoding is declared but unknown.
  102.     '''
  103.     str = str.split('\n')[:2]
  104.     str = '\n'.join(str)
  105.     match = coding_re.search(str)
  106.     if not match:
  107.         return None
  108.     
  109.     name = match.group(1)
  110.     import codecs as codecs
  111.     
  112.     try:
  113.         codecs.lookup(name)
  114.     except LookupError:
  115.         raise LookupError, 'Unknown encoding ' + name
  116.  
  117.     return name
  118.  
  119.  
  120. class IOBinding:
  121.     
  122.     def __init__(self, editwin):
  123.         self.editwin = editwin
  124.         self.text = editwin.text
  125.         self._IOBinding__id_open = self.text.bind('<<open-window-from-file>>', self.open)
  126.         self._IOBinding__id_save = self.text.bind('<<save-window>>', self.save)
  127.         self._IOBinding__id_saveas = self.text.bind('<<save-window-as-file>>', self.save_as)
  128.         self._IOBinding__id_savecopy = self.text.bind('<<save-copy-of-window-as-file>>', self.save_a_copy)
  129.         self.fileencoding = None
  130.         self._IOBinding__id_print = self.text.bind('<<print-window>>', self.print_window)
  131.  
  132.     
  133.     def close(self):
  134.         self.text.unbind('<<open-window-from-file>>', self._IOBinding__id_open)
  135.         self.text.unbind('<<save-window>>', self._IOBinding__id_save)
  136.         self.text.unbind('<<save-window-as-file>>', self._IOBinding__id_saveas)
  137.         self.text.unbind('<<save-copy-of-window-as-file>>', self._IOBinding__id_savecopy)
  138.         self.text.unbind('<<print-window>>', self._IOBinding__id_print)
  139.         self.editwin = None
  140.         self.text = None
  141.         self.filename_change_hook = None
  142.  
  143.     
  144.     def get_saved(self):
  145.         return self.editwin.get_saved()
  146.  
  147.     
  148.     def set_saved(self, flag):
  149.         self.editwin.set_saved(flag)
  150.  
  151.     
  152.     def reset_undo(self):
  153.         self.editwin.reset_undo()
  154.  
  155.     filename_change_hook = None
  156.     
  157.     def set_filename_change_hook(self, hook):
  158.         self.filename_change_hook = hook
  159.  
  160.     filename = None
  161.     dirname = None
  162.     
  163.     def set_filename(self, filename):
  164.         if filename and os.path.isdir(filename):
  165.             self.filename = None
  166.             self.dirname = filename
  167.         else:
  168.             self.filename = filename
  169.             self.dirname = None
  170.             self.set_saved(1)
  171.             if self.filename_change_hook:
  172.                 self.filename_change_hook()
  173.             
  174.  
  175.     
  176.     def open(self, event = None, editFile = None):
  177.         if self.editwin.flist:
  178.             if not editFile:
  179.                 filename = self.askopenfile()
  180.             else:
  181.                 filename = editFile
  182.             if filename:
  183.                 
  184.                 try:
  185.                     interp = self.editwin.interp
  186.                 except:
  187.                     interp = None
  188.  
  189.                 if not (self.filename) and self.get_saved() and not interp:
  190.                     self.editwin.flist.open(filename, self.loadfile)
  191.                 else:
  192.                     self.editwin.flist.open(filename)
  193.             else:
  194.                 self.text.focus_set()
  195.             return 'break'
  196.         
  197.         if self.get_saved():
  198.             reply = self.maybesave()
  199.             if reply == 'cancel':
  200.                 self.text.focus_set()
  201.                 return 'break'
  202.             
  203.         
  204.         if not editFile:
  205.             filename = self.askopenfile()
  206.         else:
  207.             filename = editFile
  208.         if filename:
  209.             self.loadfile(filename)
  210.         else:
  211.             self.text.focus_set()
  212.         return 'break'
  213.  
  214.     eol = '(\\r\\n)|\\n|\\r'
  215.     eol_re = re.compile(eol)
  216.     eol_convention = os.linesep
  217.     
  218.     def loadfile(self, filename):
  219.         
  220.         try:
  221.             f = open(filename, 'rb')
  222.             chars = f.read()
  223.             f.close()
  224.         except IOError:
  225.             msg = None
  226.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  227.             return False
  228.  
  229.         chars = self.decode(chars)
  230.         firsteol = self.eol_re.search(chars)
  231.         if firsteol:
  232.             self.eol_convention = firsteol.group(0)
  233.             if isinstance(self.eol_convention, unicode):
  234.                 self.eol_convention = self.eol_convention.encode('ascii')
  235.             
  236.             chars = self.eol_re.sub('\\n', chars)
  237.         
  238.         self.text.delete('1.0', 'end')
  239.         self.set_filename(None)
  240.         self.text.insert('1.0', chars)
  241.         self.reset_undo()
  242.         self.set_filename(filename)
  243.         self.text.mark_set('insert', '1.0')
  244.         self.text.see('insert')
  245.         self.updaterecentfileslist(filename)
  246.         return True
  247.  
  248.     
  249.     def decode(self, chars):
  250.         '''Create a Unicode string
  251.  
  252.         If that fails, let Tcl try its best
  253.         '''
  254.         if chars.startswith(BOM_UTF8):
  255.             
  256.             try:
  257.                 chars = chars[3:].decode('utf-8')
  258.             except UnicodeError:
  259.                 return chars
  260.  
  261.             self.fileencoding = BOM_UTF8
  262.             return chars
  263.         
  264.         
  265.         try:
  266.             enc = coding_spec(chars)
  267.         except LookupError:
  268.             name = None
  269.             tkMessageBox.showerror(title = 'Error loading the file', message = "The encoding '%s' is not known to this Python installation. The file may not display correctly" % name, master = self.text)
  270.             enc = None
  271.  
  272.         if enc:
  273.             
  274.             try:
  275.                 return unicode(chars, enc)
  276.             except UnicodeError:
  277.                 pass
  278.             except:
  279.                 None<EXCEPTION MATCH>UnicodeError
  280.             
  281.  
  282.         None<EXCEPTION MATCH>UnicodeError
  283.         
  284.         try:
  285.             return unicode(chars, 'ascii')
  286.         except UnicodeError:
  287.             pass
  288.  
  289.         
  290.         try:
  291.             chars = unicode(chars, encoding)
  292.             self.fileencoding = encoding
  293.         except UnicodeError:
  294.             pass
  295.  
  296.         return chars
  297.  
  298.     
  299.     def maybesave(self):
  300.         if self.get_saved():
  301.             return 'yes'
  302.         
  303.         if not self.filename:
  304.             pass
  305.         message = 'Do you want to save %s before closing?' % 'this untitled document'
  306.         m = tkMessageBox.Message(title = 'Save On Close', message = message, icon = tkMessageBox.QUESTION, type = tkMessageBox.YESNOCANCEL, master = self.text)
  307.         reply = m.show()
  308.         if reply == 'yes':
  309.             self.save(None)
  310.             if not self.get_saved():
  311.                 reply = 'cancel'
  312.             
  313.         
  314.         self.text.focus_set()
  315.         return reply
  316.  
  317.     
  318.     def save(self, event):
  319.         None if not self.filename else None<EXCEPTION MATCH>AttributeError
  320.         self.text.focus_set()
  321.         return 'break'
  322.  
  323.     
  324.     def save_as(self, event):
  325.         filename = self.asksavefile()
  326.         if filename:
  327.             if self.writefile(filename):
  328.                 self.set_filename(filename)
  329.                 self.set_saved(1)
  330.                 
  331.                 try:
  332.                     self.editwin.store_file_breaks()
  333.                 except AttributeError:
  334.                     pass
  335.                 except:
  336.                     None<EXCEPTION MATCH>AttributeError
  337.                 
  338.  
  339.             None<EXCEPTION MATCH>AttributeError
  340.         
  341.         self.text.focus_set()
  342.         self.updaterecentfileslist(filename)
  343.         return 'break'
  344.  
  345.     
  346.     def save_a_copy(self, event):
  347.         filename = self.asksavefile()
  348.         if filename:
  349.             self.writefile(filename)
  350.         
  351.         self.text.focus_set()
  352.         self.updaterecentfileslist(filename)
  353.         return 'break'
  354.  
  355.     
  356.     def writefile(self, filename):
  357.         self.fixlastline()
  358.         chars = self.encode(self.text.get('1.0', 'end-1c'))
  359.         if self.eol_convention != '\n':
  360.             chars = chars.replace('\n', self.eol_convention)
  361.         
  362.         
  363.         try:
  364.             f = open(filename, 'wb')
  365.             f.write(chars)
  366.             f.close()
  367.             return True
  368.         except IOError:
  369.             msg = None
  370.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  371.             return False
  372.  
  373.  
  374.     
  375.     def encode(self, chars):
  376.         if isinstance(chars, types.StringType):
  377.             return chars
  378.         
  379.         
  380.         try:
  381.             return chars.encode('ascii')
  382.         except UnicodeError:
  383.             pass
  384.  
  385.         
  386.         try:
  387.             enc = coding_spec(chars)
  388.             failed = None
  389.         except LookupError:
  390.             msg = None
  391.             failed = msg
  392.             enc = None
  393.  
  394.         if enc:
  395.             
  396.             try:
  397.                 return chars.encode(enc)
  398.             except UnicodeError:
  399.                 failed = "Invalid encoding '%s'" % enc
  400.             except:
  401.                 None<EXCEPTION MATCH>UnicodeError
  402.             
  403.  
  404.         None<EXCEPTION MATCH>UnicodeError
  405.         if failed:
  406.             tkMessageBox.showerror('I/O Error', '%s. Saving as UTF-8' % failed, master = self.text)
  407.         
  408.         if self.fileencoding == BOM_UTF8 or failed:
  409.             return BOM_UTF8 + chars.encode('utf-8')
  410.         
  411.         if self.fileencoding:
  412.             
  413.             try:
  414.                 return chars.encode(self.fileencoding)
  415.             except UnicodeError:
  416.                 tkMessageBox.showerror('I/O Error', "Cannot save this as '%s' anymore. Saving as UTF-8" % self.fileencoding, master = self.text)
  417.                 return BOM_UTF8 + chars.encode('utf-8')
  418.             except:
  419.                 None<EXCEPTION MATCH>UnicodeError
  420.             
  421.  
  422.         None<EXCEPTION MATCH>UnicodeError
  423.         config_encoding = idleConf.GetOption('main', 'EditorWindow', 'encoding')
  424.         if config_encoding == 'utf-8':
  425.             return BOM_UTF8 + chars.encode('utf-8')
  426.         
  427.         ask_user = True
  428.         
  429.         try:
  430.             chars = chars.encode(encoding)
  431.             enc = encoding
  432.             if config_encoding == 'locale':
  433.                 ask_user = False
  434.         except UnicodeError:
  435.             chars = BOM_UTF8 + chars.encode('utf-8')
  436.             enc = 'utf-8'
  437.  
  438.         if not ask_user:
  439.             return chars
  440.         
  441.         dialog = EncodingMessage(self.editwin.top, enc)
  442.         dialog.go()
  443.         if dialog.num == 1:
  444.             encline = '# -*- coding: %s -*-\n' % enc
  445.             firstline = self.text.get('1.0', '2.0')
  446.             if firstline.startswith('#!'):
  447.                 self.text.insert('2.0', encline)
  448.             else:
  449.                 self.text.insert('1.0', encline)
  450.             return self.encode(self.text.get('1.0', 'end-1c'))
  451.         
  452.         return chars
  453.  
  454.     
  455.     def fixlastline(self):
  456.         c = self.text.get('end-2c')
  457.         if c != '\n':
  458.             self.text.insert('end-1c', '\n')
  459.         
  460.  
  461.     
  462.     def print_window(self, event):
  463.         tempfilename = None
  464.         saved = self.get_saved()
  465.         if saved:
  466.             filename = self.filename
  467.         
  468.         if not saved or filename is None:
  469.             (tfd, tempfilename) = tempfile.mkstemp(prefix = 'IDLE_tmp_')
  470.             filename = tempfilename
  471.             os.close(tfd)
  472.             if not self.writefile(tempfilename):
  473.                 os.unlink(tempfilename)
  474.                 return 'break'
  475.             
  476.         
  477.         platform = os.name
  478.         printPlatform = 1
  479.         if platform == 'posix':
  480.             command = idleConf.GetOption('main', 'General', 'print-command-posix')
  481.             command = command + ' 2>&1'
  482.         elif platform == 'nt':
  483.             command = idleConf.GetOption('main', 'General', 'print-command-win')
  484.         else:
  485.             printPlatform = 0
  486.         if printPlatform:
  487.             command = command % filename
  488.             pipe = os.popen(command, 'r')
  489.             output = pipe.read().strip()
  490.             status = pipe.close()
  491.             if status:
  492.                 output = 'Printing failed (exit status 0x%x)\n' % status + output
  493.             
  494.             if output:
  495.                 output = 'Printing command: %s\n' % repr(command) + output
  496.                 tkMessageBox.showerror('Print status', output, master = self.text)
  497.             
  498.         else:
  499.             message = 'Printing is not enabled for this platform: %s' % platform
  500.             tkMessageBox.showinfo('Print status', message, master = self.text)
  501.         if tempfilename:
  502.             os.unlink(tempfilename)
  503.         
  504.         return 'break'
  505.  
  506.     opendialog = None
  507.     savedialog = None
  508.     filetypes = [
  509.         ('Python and text files', '*.py *.pyw *.txt', 'TEXT'),
  510.         ('All text files', '*', 'TEXT'),
  511.         ('All files', '*')]
  512.     
  513.     def askopenfile(self):
  514.         (dir, base) = self.defaultfilename('open')
  515.         if not self.opendialog:
  516.             self.opendialog = tkFileDialog.Open(master = self.text, filetypes = self.filetypes)
  517.         
  518.         return self.opendialog.show(initialdir = dir, initialfile = base)
  519.  
  520.     
  521.     def defaultfilename(self, mode = 'open'):
  522.         if self.filename:
  523.             return os.path.split(self.filename)
  524.         elif self.dirname:
  525.             return (self.dirname, '')
  526.         else:
  527.             
  528.             try:
  529.                 pwd = os.getcwd()
  530.             except os.error:
  531.                 pwd = ''
  532.  
  533.             return (pwd, '')
  534.  
  535.     
  536.     def asksavefile(self):
  537.         (dir, base) = self.defaultfilename('save')
  538.         if not self.savedialog:
  539.             self.savedialog = tkFileDialog.SaveAs(master = self.text, filetypes = self.filetypes)
  540.         
  541.         return self.savedialog.show(initialdir = dir, initialfile = base)
  542.  
  543.     
  544.     def updaterecentfileslist(self, filename):
  545.         '''Update recent file list on all editor windows'''
  546.         self.editwin.update_recent_files_list(filename)
  547.  
  548.  
  549.  
  550. def test():
  551.     root = Tk()
  552.     
  553.     class MyEditWin:
  554.         
  555.         def __init__(self, text):
  556.             self.text = text
  557.             self.flist = None
  558.             self.text.bind('<Control-o>', self.open)
  559.             self.text.bind('<Control-s>', self.save)
  560.             self.text.bind('<Alt-s>', self.save_as)
  561.             self.text.bind('<Alt-z>', self.save_a_copy)
  562.  
  563.         
  564.         def get_saved(self):
  565.             return 0
  566.  
  567.         
  568.         def set_saved(self, flag):
  569.             pass
  570.  
  571.         
  572.         def reset_undo(self):
  573.             pass
  574.  
  575.         
  576.         def open(self, event):
  577.             self.text.event_generate('<<open-window-from-file>>')
  578.  
  579.         
  580.         def save(self, event):
  581.             self.text.event_generate('<<save-window>>')
  582.  
  583.         
  584.         def save_as(self, event):
  585.             self.text.event_generate('<<save-window-as-file>>')
  586.  
  587.         
  588.         def save_a_copy(self, event):
  589.             self.text.event_generate('<<save-copy-of-window-as-file>>')
  590.  
  591.  
  592.     text = Text(root)
  593.     text.pack()
  594.     text.focus_set()
  595.     editwin = MyEditWin(text)
  596.     io = IOBinding(editwin)
  597.     root.mainloop()
  598.  
  599. if __name__ == '__main__':
  600.     test()
  601.  
  602.